package gek.uni.diplom.integrate.wizard.page;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.internal.ide.DialogUtil;
import org.eclipse.ui.internal.ide.dialogs.ResourceTreeAndListGroup;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

/**
 * Страница выбора файла класса, в котором содержится определение класса,
 * который тестируется.<br/>
 * Выбирается первый файл с описанием класса из списка, передаваемого в
 * конструктор, и создается страница. Для остальных описаний создаются другие
 * страницы wizard'а
 * 
 * @author Gek
 * 
 */
public class ClassUnderTestSelectPage extends WizardPage {

  List<IFile> testDescriptionFiles;
  private ResourceTreeAndListGroup resourceGroup;

  protected ClassUnderTestSelectPage(String pageName) {
    this(pageName, new ArrayList<IFile>(0));
  }

  protected ClassUnderTestSelectPage(String pageName,
      List<IFile> testDescriptionFiles) {
    super(pageName);
    this.testDescriptionFiles = testDescriptionFiles;
  }

  @Override
  public void createControl(Composite parent) {
    initializeDialogUnits(parent);

    IFile descriptionFile = testDescriptionFiles.get(0);

    Composite topLevel = new Composite(parent, SWT.NONE);
    topLevel.setLayout(new GridLayout(1, true));
    topLevel.setBackground(parent.getShell().getDisplay().getSystemColor(
        SWT.COLOR_BLUE));

    List input = new ArrayList();
    IProject[] projects =
        ResourcesPlugin.getWorkspace().getRoot().getProjects();
    for (int i = 0; i < projects.length; i++) {
      if (projects[i].isOpen()) {
        input.add(projects[i]);
      }
    }

    this.resourceGroup =
        new ResourceTreeAndListGroup(topLevel, input,
            getResourceProvider(IResource.FOLDER | IResource.PROJECT),
            WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
            getResourceProvider(IResource.FILE), WorkbenchLabelProvider
                .getDecoratingWorkbenchLabelProvider(), SWT.NONE, DialogUtil
                .inRegularFontMode(parent));

    ICheckStateListener listener = new ICheckStateListener() {
      public void checkStateChanged(CheckStateChangedEvent event) {
        updateWidgetEnablements();
      }
    };

    this.resourceGroup.addCheckStateListener(listener);

    setErrorMessage(null);
    setMessage(null);
    setControl(topLevel);
  }

  private ITreeContentProvider getResourceProvider(final int resourceType) {
    return new WorkbenchContentProvider() {
      public Object[] getChildren(Object o) {
        if (o instanceof IContainer) {
          IResource[] members = null;
          try {
            members = ((IContainer) o).members();
          } catch (CoreException e) {
            // just return an empty set of children
            return new Object[0];
          }

          // filter out the desired resource types
          ArrayList results = new ArrayList();
          for (int i = 0; i < members.length; i++) {
            // And the test bits with the resource types to see if they are what
            // we want
            if ((members[i].getType() & resourceType) > 0) {
              results.add(members[i]);
            }
          }
          return results.toArray();
        }
        // input element case
        if (o instanceof ArrayList) {
          return ((ArrayList) o).toArray();
        }
        return new Object[0];
      }
    };
  }

  /**
   * Check if widgets are enabled or disabled by a change in the dialog.
   */
  @SuppressWarnings("restriction")
  protected void updateWidgetEnablements() {

    List allCheckedListItems = resourceGroup.getAllCheckedListItems();

    System.out.println(allCheckedListItems.size());
    boolean pageComplete = determinePageCompletion();
    setPageComplete(pageComplete);
    if (pageComplete) {
      setMessage(null);
      setErrorMessage(null);
    } else {
      setErrorMessage("Не выбран ни один файл описания тестов");
    }
    // super.updateWidgetEnablements();
  }

  
  private boolean determinePageCompletion() {
    return !resourceGroup.getAllCheckedListItems().isEmpty();
  }

  @Override
  public IWizardPage getNextPage() {
    List<IFile> subList = this.testDescriptionFiles.subList(1, testDescriptionFiles.size());
    if (subList.isEmpty())
      return null;
    return new ClassUnderTestSelectPage("Выберите файл с определением класса ",
        subList);
  }
}
